home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / board / GNUChess4_0_58.lha / gnuchess-4.0 / src / new / nuxdsp.c < prev    next >
C/C++ Source or Header  |  1992-08-26  |  21KB  |  1,061 lines

  1. /*
  2.  * nuxdsp.c - (new)  ALPHA interface for CHESS
  3.  *
  4.  * Copyright (c) 1988,1989,1990 John Stanback
  5.  * Copyright (c) 1992 Free Software Foundation
  6.  *
  7.  * This file is part of GNU CHESS.
  8.  *
  9.  * GNU Chess is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * GNU Chess is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU Chess; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include <ctype.h>
  24. #include <signal.h>
  25. #ifdef MSDOS
  26. #include <dos.h>
  27. #include <conio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <time.h>
  31.  
  32. #define ESC 0x1B
  33. #define refresh() fflush(stdout)
  34.  
  35. int mycntl1, mycntl2;
  36. static void param (short n);
  37.  
  38. #else
  39. #include <sys/param.h>
  40. #include <sys/types.h>
  41. #include <sys/file.h>
  42. #include <curses.h>
  43.      extern short int sscore[];
  44.  
  45. #if defined(__STDC__)
  46. /* <stdlib.h> */
  47.      extern void *malloc (size_t);
  48.      extern void exit (int);
  49.  
  50. /* <string.h> */
  51.      extern char *strcat (char *, const char *);
  52.      extern int strcmp (const char *, const char *);
  53.      extern char *strcpy (char *, const char *);
  54.  
  55. /* <time.h> */
  56.      extern long int time (long int *);
  57. #endif
  58.  
  59. #endif /* MSDOS */
  60.  
  61. #include "gnuchess.h"
  62.  
  63. extern short int pscore[2];
  64.  
  65. #define TAB (43)
  66. /* coordinates within a square for the following are ([1,5],[1,3]) */
  67. #define SQW (5)
  68. #define SQH (3)
  69. #define VIR_C(s)  ((flag.reverse) ? 7-column(s) : column(s))
  70. #define VIR_R(s)  ((flag.reverse) ? 7-row(s) : row(s))
  71. #define VSQ_X(x)  ((flag.reverse) ? SQW + 1 - (x) : (x))
  72. #define VSQ_Y(y)  ((flag.reverse) ? SQH + 1 - (y) : (y))
  73. #define Vblack(s) (!((VIR_C(s) + VIR_R(s)) % 2))
  74. /* Squares swapped */
  75. #define Vcoord(s,x,y) \
  76.     ((SQW)*(VIR_C(s)))+(x),((SQH)*(7-VIR_R(s))+(y))
  77. /* Squares and internal locations swapped */
  78. #define VcoordI(s,x,y) \
  79.     ((SQW)*(VIR_C(s)))+(VSQ_X(x)),((SQH)*(7-VIR_R(s))+(VSQ_Y(y)))
  80. /* Squares and internal rows swapped */
  81. #define VcoordR(s,x,y) \
  82.     ((SQW)*(VIR_C(s)))+(x),((SQH)*(7-VIR_R(s))+(VSQ_Y(y)))
  83. char Analysis[128] = "";
  84. unsigned short int MV[MAXDEPTH];
  85. int MSCORE;
  86. char *DRAW;
  87. extern char mvstr[4][6];
  88. extern short Mwpawn[64], Mbpawn[64], Mknight[2][64], Mbishop[2][64];
  89. short PositionFlag = 0;
  90.  
  91. #if defined(MSDOS) && !defined(SEVENBIT)
  92. static void ONormal (void);
  93. static void OReverse (void);
  94.  
  95. #endif /* MSDOS && !SEVENBIT */
  96.  
  97. extern char *getenv (const char *);
  98. void TerminateSearch (int), Die (int);
  99.  
  100. void
  101. Initialize (void)
  102. {
  103.   signal (SIGINT, Die);
  104. #ifndef MSDOS
  105.   signal (SIGQUIT, Die);
  106.   initscr ();
  107.   crmode ();
  108. #else
  109.   mycntl1 = mycntl2 = 0;
  110. #endif /* MSDOS */
  111. }
  112.  
  113. void
  114. ExitChess (void)
  115. {
  116.   ListGame ();
  117.   gotoXY (1, 24);
  118. #ifndef MSDOS
  119.   refresh();
  120.   nocrmode ();
  121.   endwin ();
  122. #endif /* MSDOS */
  123.   exit (0);
  124. }
  125.  
  126. void
  127. Die (int Sig)
  128. {
  129.   char s[80];
  130.  
  131.   signal (SIGINT, SIG_IGN);
  132. #ifdef MSDOS
  133.   Sig++;            /* shut up the compiler */
  134. #else
  135.   signal (SIGQUIT, SIG_IGN);
  136. #endif /* MSDOS */
  137.   ShowMessage (CP[31]);        /*Abort?*/
  138.   scanz ("%s", s);
  139.   if (strcmp (s, CP[210]) == 0)    /*yes*/
  140.     ExitChess ();
  141.   signal (SIGINT, Die);
  142. #ifndef MSDOS
  143.   signal (SIGQUIT, Die);
  144. #endif /* MSDOS */
  145. }
  146.  
  147. void
  148. TerminateSearch (int Sig)
  149. {
  150.   signal (SIGINT, SIG_IGN);
  151. #ifdef MSDOS
  152.   Sig++;            /* shut up the compiler */
  153. #else
  154.   signal (SIGQUIT, SIG_IGN);
  155. #endif /* MSDOS */
  156.   if (!flag.timeout)
  157.     flag.musttimeout = true;
  158.   flag.bothsides = false;
  159.   signal (SIGINT, Die);
  160. #ifndef MSDOS
  161.   signal (SIGQUIT, Die);
  162. #endif /* MSDOS */
  163. }
  164. void
  165. ShowLine (short unsigned int *bstline)
  166. {
  167. }
  168.  
  169. void
  170. help (void)
  171. {
  172.   ClrScreen ();
  173.   /*printz ("CHESS command summary\n");*/
  174.   printz (CP[40]);
  175.   printz ("----------------------------------------------------------------\n");
  176.   /*printz ("g1f3      move from g1 to f3      quit      Exit Chess\n");*/
  177.   printz (CP[158]);
  178.   /*printz ("Nf3       move knight to f3       beep      turn %s\n", (flag.beep) ? "off" : "on");*/
  179.   printz (CP[86]);
  180.   /*printz ("a7a8q     promote pawn to queen\n");*/
  181.   printz (CP[128], (flag.material) ? CP[92] : CP[93]);
  182.   /*printz ("o-o       castle king side        easy      turn %s\n", (flag.easy) ? "off" : "on");*/
  183.   printz (CP[173], (flag.easy) ? CP[92] : CP[93]);
  184.   /*printz ("o-o-o     castle queen side       hash      turn %s\n", (flag.hash) ? "off" : "on");*/
  185.   printz (CP[174], (flag.hash) ? CP[92] : CP[93]);
  186.   /*printz ("bd        redraw board            reverse   board display\n");*/
  187.   printz (CP[130]);
  188.   /*printz ("list      game to chess.lst       book      turn %s used %d of %d\n", (Book) ? "off" : "on", bookcount, BOOKSIZE);*/
  189.   printz (CP[170], (Book) ? CP[92] : CP[93], bookcount, BOOKSIZE);
  190.   /*printz ("undo      undo last ply           remove    take back a move\n");*/
  191.   printz (CP[200]);
  192.   /*printz ("edit      edit board              force     enter game moves\n");*/
  193.   printz (CP[153]);
  194.   /*printz ("switch    sides with computer     both      computer match\n");*/
  195.   printz (CP[194]);
  196.   /*printz ("white     computer plays white    black     computer plays black\n");*/
  197.   printz (CP[202]);
  198.   /*printz ("depth     set search depth        clock     set time control\n");*/
  199.   printz (CP[149]);
  200.   /*printz ("hint      suggest a move         post      turn %s principle variation\n", (flag.post) ? "off" : "on");*/
  201.   printz (CP[177], (flag.post) ? CP[92] : CP[93]);
  202.   /*printz ("save      game to file            get       game from file\n");*/
  203.   printz (CP[188]);
  204.   /*printz ("random    randomize play          new       start new game\n");*/
  205.   printz (CP[181]);
  206.   /*printz ("coords    show coords            rv        reverse video\n");*/
  207.   printz (CP[144]);
  208. #if !defined(MSDOS) || defined(SEVENBIT)
  209.   printz (CP[192]);
  210. #endif /* !MSDOS || SEVENBIT */
  211.   gotoXY (10, 20);
  212.   printz (CP[47], ColorStr[computer]);
  213.   gotoXY (10, 21);
  214.   printz (CP[97], ColorStr[opponent]);
  215.   gotoXY (10, 22);
  216.   printz (CP[79], MaxResponseTime/100);
  217.   gotoXY (10, 23);
  218.   printz (CP[59], (flag.easy) ? CP[93] : CP[92]);
  219.   gotoXY (40, 20);
  220.   printz (CP[52], MaxSearchDepth);
  221.   gotoXY (40, 21);
  222.   printz (CP[100], (dither) ? CP[93] : CP[92]);
  223.   gotoXY (40, 22);
  224.   printz (CP[112], (flag.hash) ? CP[93] : CP[92]);
  225.   gotoXY (40, 23);
  226.   printz (CP[73]);
  227.   gotoXY (10, 24);
  228.   printz (CP[110], (TCflag) ? CP[93] : CP[92],
  229.       TimeControl.moves[white], TimeControl.clock[white] / 100, OperatorTime, MaxSearchDepth);
  230.   refresh ();
  231. #ifdef BOGUS
  232.   fflush (stdin); /*what is this supposed to do??*/
  233. #endif /*BOGUS*/
  234.   getchar ();
  235.   ClrScreen ();
  236.   UpdateDisplay (0, 0, 1, 0);
  237. }
  238.  
  239. void
  240. EditBoard (void)
  241.  
  242. /*
  243.  * Set up a board position. Pieces are entered by typing the piece followed
  244.  * by the location. For example, Nf3 will place a knight on square f3.
  245.  */
  246.  
  247. {
  248.   short a, r, c, sq, i;
  249.   char s[80];
  250.  
  251.   flag.regularstart = false;
  252.   Book = false;
  253.   ClrScreen ();
  254.   UpdateDisplay (0, 0, 1, 0);
  255.   gotoXY (TAB, 3);
  256.   printz (CP[29]);
  257.   gotoXY (TAB, 4);
  258.   printz (CP[28]);
  259.   gotoXY (TAB, 5);
  260.   printz (CP[136]);
  261.   gotoXY (TAB, 7);
  262.   printz (CP[64]);
  263.   a = white;
  264.   do
  265.     {
  266.       gotoXY (TAB, 6);
  267.       printz (CP[60], ColorStr[a]);    /*Editing %s*/
  268.       gotoXY (TAB + 24, 7);
  269.       ClrEoln ();
  270.       scanz ("%s", s);
  271.       if (s[0] == CP[28][0])    /*#*/
  272.     {
  273.       for (sq = 0; sq < 64; sq++)
  274.         {
  275.           board[sq] = no_piece;
  276.           color[sq] = neutral;
  277.           DrawPiece (sq);
  278.         }
  279.     }
  280.       if (s[0] == CP[136][0])    /*c*/
  281.     a = otherside[a];
  282.       c = s[1] - 'a';
  283.       r = s[2] - '1';
  284.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  285.     {
  286.       sq = locn (r, c);
  287.       for (i = king; i > no_piece; i--)
  288.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  289.           break;
  290.       board[sq] = i;
  291.       color[sq] = ((board[sq] == no_piece) ? neutral : a);
  292.       DrawPiece (sq);
  293.     }
  294.   } while (s[0] != CP[29][0]);
  295.  
  296.   for (sq = 0; sq < 64; sq++)
  297.     Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
  298.   GameCnt = 0;
  299.   Game50 = 1;
  300.   ZeroRPT ();
  301.   Sdepth = 0;
  302.   InitializeStats ();
  303.   ClrScreen ();
  304.   UpdateDisplay (0, 0, 1, 0);
  305. }
  306.  
  307. void
  308. ShowPlayers (void)
  309. {
  310.   gotoXY (TAB, ((flag.reverse) ? 23 : 2));
  311.   printz ("%s", (computer == black) ? CP[218] : CP[74]);
  312.   gotoXY (TAB, ((flag.reverse) ? 2 : 23));
  313.   printz ("%s", (computer == white) ? CP[218] : CP[74]);
  314. }
  315.  
  316. void
  317. ShowDepth (char ch)
  318. {
  319.   gotoXY (TAB, 4);
  320.   printz (CP[53], Sdepth, ch);    /*Depth= %d%c*/
  321.   ClrEoln ();
  322. }
  323.  
  324. void
  325. ShowScore (short score)
  326. {
  327.   gotoXY (TAB, 5);
  328.  printz (CP[104], score);
  329.   ClrEoln ();
  330. }
  331.  
  332. void
  333. ShowMessage (char *s)
  334. {
  335.   gotoXY (TAB, 6);
  336.   printz ("%s", s);
  337.   ClrEoln ();
  338. }
  339.  
  340. void
  341. ClearMessage (void)
  342. {
  343.   gotoXY (TAB, 6);
  344.   ClrEoln ();
  345. }
  346.  
  347. void
  348. ShowCurrentMove (short int pnt, short int f, short int t)
  349. {
  350.   algbr (f, t, false);
  351.   gotoXY (TAB, 7);
  352.   printz ("(%2d) %4s", pnt, mvstr[0]);
  353. }
  354.  
  355. void
  356. ShowHeader (void)
  357. {
  358.   gotoXY (TAB, 10);
  359. #ifdef MSDOS
  360.   printz (CP[67]);
  361. #else
  362.   printz (CP[68]);
  363. #endif /* MSDOS */
  364. }
  365.  
  366. void
  367. ShowSidetoMove (void)
  368. {
  369.   gotoXY (TAB, 14);
  370.   printz ("%2d:   %s", 1 + GameCnt / 2, ColorStr[player]);
  371.   ClrEoln ();
  372. }
  373.  
  374. void
  375. ShowPrompt (void)
  376. {
  377.   gotoXY (TAB, 19);
  378.   printz (CP[121]);        /*Your movwe is?*/
  379.   ClrEoln ();
  380. }
  381.  
  382. void
  383. ShowNodeCnt (long int NodeCnt)
  384. {
  385.   gotoXY (TAB, 21);
  386.   printz (CP[90], NodeCnt, (et > 100) ? NodeCnt / (et / 100) : 0);
  387.   ClrEoln ();
  388. }
  389.  
  390. void
  391. ShowResults (short int score, short unsigned int *bstline, char ch)
  392. {
  393.   unsigned char d, ply;
  394.  
  395.   if (flag.post)
  396.     {
  397.       ShowDepth (ch);
  398.       ShowScore (score);
  399.       d = 7;
  400.       for (ply = 1; bstline[ply] > 0; ply++)
  401.     {
  402.       if (ply % 4 == 1)
  403.         {
  404.           gotoXY (TAB, ++d);
  405.           ClrEoln ();
  406.         }
  407.       algbr ((short) bstline[ply] >> 8, (short) bstline[ply] & 0xFF, false);
  408.       printz ("%5s ", mvstr[0]);
  409.     }
  410.       ClrEoln ();
  411.       while (d < 13)
  412.     {
  413.       gotoXY (TAB, ++d);
  414.       ClrEoln ();
  415.     }
  416.     }
  417. }
  418.  
  419. void
  420. SearchStartStuff (short int side)
  421. {
  422.   short i;
  423.  
  424.   signal (SIGINT, TerminateSearch);
  425. #ifdef MSDOS
  426.   side++;            /* shut up the compiler */
  427. #else
  428.   signal (SIGQUIT, TerminateSearch);
  429. #endif /* MSDOS */
  430.   for (i = 4; i < 14; i++)
  431.     {
  432.       gotoXY (TAB, i);
  433.       ClrEoln ();
  434.     }
  435. }
  436.  
  437. void
  438. OutputMove (void)
  439. {
  440.   register int i;
  441.  
  442.   UpdateDisplay (rootnode.f, rootnode.t, 0, (short) rootnode.flags);
  443.   gotoXY (TAB, 17);
  444.   if(flag.illegal) {printz (CP[225]); return;}
  445.   printz (CP[84], mvstr[0]);    /*My move is %s*/
  446.   if (flag.beep)
  447.     putchar (7);
  448.   ClrEoln ();
  449.  
  450.   gotoXY (TAB, 24);
  451.   if (rootnode.flags & draw)
  452.     printz (CP[56], DRAW);
  453.   else if (rootnode.score == -9999)
  454.     printz (CP[95]);
  455.   else if (rootnode.score == 9998)
  456.     printz (CP[44]);
  457. #ifdef VERYBUGGY
  458.   else if (rootnode.score < -9000)
  459.     printz (CP[96]);
  460.   else if (rootnode.score > 9000)
  461.     printz (CP[45]);
  462. #endif /*VERYBUGGY*/
  463.   ClrEoln ();
  464.  
  465.   if (flag.post)
  466.     {
  467.       register short h, l, t;
  468.  
  469.       h = TREE;
  470.       l = 0;
  471.       t = TREE >> 1;
  472.       while (l != t)
  473.     {
  474.       if (Tree[t].f || Tree[t].t)
  475.         l = t;
  476.       else
  477.         h = t;
  478.       t = (l + h) >> 1;
  479.     }
  480.  
  481.  
  482.       ShowNodeCnt (NodeCnt);
  483.       gotoXY (TAB, 22);
  484.  
  485.       printz (CP[81], t);    /*Max Tree= %d*/
  486.       ClrEoln ();
  487.     }
  488. }
  489.  
  490. void
  491. UpdateClocks (void)
  492. {
  493.   short m, s;
  494.  
  495.   m = (short) (et / 6000);
  496.   s = (short) (et - 6000 * (long) m) / 100;
  497.   if (TCflag)
  498.     {
  499.       m = (short) ((TimeControl.clock[player] - et) / 6000);
  500.       s = (short) ((TimeControl.clock[player] - et - 6000 * (long) m) / 100);
  501.     }
  502.   if (m < 0)
  503.     m = 0;
  504.   if (s < 0)
  505.     s = 0;
  506.   if (player == white)
  507.     gotoXY (60, (flag.reverse) ? 2 : 23);
  508.   else
  509.     gotoXY (60, (flag.reverse) ? 23 : 2);
  510.   printz ("%d:%02d   ", m, s);
  511.   if (flag.post)
  512.     ShowNodeCnt (NodeCnt);
  513.   refresh ();
  514. }
  515.  
  516. void
  517. gotoXY (short int x, short int y)
  518. {
  519. #ifdef MSDOS
  520.   putchar (ESC);
  521.   putchar ('[');
  522.   param (y);
  523.   putchar (';');
  524.   param (x);
  525.   putchar ('H');
  526. #else
  527.   move (y - 1, x - 1);
  528. #endif /* MSDOS */
  529. }
  530.  
  531. void
  532. ClrScreen (void)
  533. {
  534. #ifdef MSDOS
  535.   putchar (ESC);
  536.   putchar ('[');
  537.   putchar ('2');
  538.   putchar ('J');
  539. #else
  540.   clear ();
  541. #endif /* MSDOS */
  542.   refresh ();
  543. }
  544.  
  545. void
  546. ClrEoln (void)
  547. {
  548. #ifdef MSDOS
  549.   putchar (ESC);
  550.   putchar ('[');
  551.   putchar ('K');
  552. #else
  553.   clrtoeol ();
  554. #endif /* MSDOS */
  555.   refresh ();
  556. }
  557.  
  558. #ifdef MSDOS
  559. void
  560. param (short n)
  561. {
  562.   if (n >= 10)
  563.     {
  564.       register short d, q;
  565.  
  566.       q = n / 10;
  567.       d = n % 10;
  568.       putchar (q + '0');
  569.       putchar (d + '0');
  570.     }
  571.   else
  572.     putchar (n + '0');
  573. }
  574.  
  575. #endif /* MSDOS */
  576.  
  577. void
  578. OReverse ()
  579. {
  580. #ifdef MSDOS
  581.   putchar (ESC);
  582.   putchar ('[');
  583.   param (7);
  584.   putchar ('m');
  585. #else
  586.   standout ();
  587.   /* attron (A_REVERSE); */
  588. #endif /* MSDOS */
  589. }
  590.  
  591. void
  592. ONormal ()
  593. {
  594. #ifdef MSDOS
  595.   putchar (ESC);
  596.   putchar ('[');
  597.   param (0);
  598.   putchar ('m');
  599. #else
  600.   standend ();
  601.   /* attroff (A_REVERSE); */
  602. #endif /* MSDOS */
  603. }
  604.  
  605. void
  606. DrawPiece (short int sq)
  607. {
  608.   gotoXY (VcoordR (sq, 2, 2));
  609.  
  610.   switch (color[sq])
  611.     {
  612.     case black:
  613.       if (flag.rv)
  614.     OReverse ();
  615. #if defined(MSDOS) && !defined(SEVENBIT)
  616.       printz (" %c ", pxx[board[sq]]);
  617. #else
  618.       printz ((flag.stars ? "*%c*" : " %c "), pxx[board[sq]]);
  619. #endif /* MSDOS && !SEVENBIT */
  620.       ONormal ();
  621.       break;
  622.     case neutral:
  623. #if defined(MSDOS) && !defined(SEVENBIT)
  624.       if (flag.rv)
  625.     printz (Vblack (sq) ? "\262\262\262" : "\260\260\260");
  626.       else
  627.     printz (Vblack (sq) ? "\260\260\260" : "\262\262\262");
  628. #else
  629.       if (flag.shade)
  630.     printz (Vblack (sq) ? "///" : "   ");
  631.       else
  632.     {
  633.       if (Vblack (sq))
  634.         OReverse ();
  635.       printz ("   ");
  636.       ONormal ();
  637.     }
  638. #endif /* MSDOS && !SEVENBIT */
  639.       break;
  640.     case white:
  641. #if defined(MSDOS) && !defined(SEVENBIT)
  642.       if (!flag.rv)
  643.     OReverse ();
  644.       printz (" %c ", pxx[board[sq]]);
  645.       ONormal ();
  646. #else
  647.       printz (" %c ", pxx[board[sq]]);
  648. #endif /* MSDOS && !SEVENBIT */
  649.       break;
  650.     default:
  651.       ShowMessage (CP[55]);    /*Draw piece color[sq] err*/
  652.       break;
  653.     }
  654. }
  655.  
  656. void
  657. DrawSquare (short int sq)
  658. {
  659. #if defined(MSDOS) && !defined(SEVENBIT)
  660.   if (flag.rv)
  661.     {
  662.       gotoXY (Vcoord (sq, 1, 1));
  663.       printz (Vblack (sq) ? "\262\262\262\262\262" : "\260\260\260\260\260");
  664.       gotoXY (Vcoord (sq, 1, 2));
  665.       printz (Vblack (sq) ? "\262\262\262\262\262" : "\260\260\260\260\260");
  666.       gotoXY (Vcoord (sq, 1, 3));
  667.       printz (Vblack (sq) ? "\262\262\262\262\262" : "\260\260\260\260\260");
  668.     }
  669.   else
  670.     {
  671.       gotoXY (Vcoord (sq, 1, 1));
  672.       printz (Vblack (sq) ? "\260\260\260\260\260" : "\262\262\262\262\262");
  673.       gotoXY (Vcoord (sq, 1, 2));
  674.       printz (Vblack (sq) ? "\260\260\260\260\260" : "\262\262\262\262\262");
  675.       gotoXY (Vcoord (sq, 1, 3));
  676.       printz (Vblack (sq) ? "\260\260\260\260\260" : "\262\262\262\262\262");
  677.     }
  678. #else
  679.   if (flag.shade)
  680.     {
  681.       gotoXY (Vcoord (sq, 1, 1));
  682.       printz (Vblack (sq) ? "/////" : "     ");
  683.       gotoXY (Vcoord (sq, 1, 2));
  684.       printz (Vblack (sq) ? "/////" : "     ");
  685.       gotoXY (Vcoord (sq, 1, 3));
  686.       printz (Vblack (sq) ? "/////" : "     ");
  687.     }
  688.   else
  689.     {
  690.       if (Vblack (sq))
  691.     OReverse ();
  692.       gotoXY (Vcoord (sq, 1, 1));
  693.       printz ("     ");
  694.       gotoXY (Vcoord (sq, 1, 2));
  695.       printz ("     ");
  696.       gotoXY (Vcoord (sq, 1, 3));
  697.       printz ("     ");
  698.       ONormal ();
  699.     }
  700. #endif /* MSDOS && !SEVENBIT */
  701. }
  702.  
  703. void
  704. DrawCoords (void)
  705. {
  706.   short z;
  707.  
  708.   for (z = 0; z <= 7; z++)
  709.     {
  710.       short sq;
  711.  
  712.       sq = z << 3;
  713.       gotoXY (VcoordI (sq, 1, 1));
  714. #if !defined(MSDOS) || defined(SEVENBIT)
  715.       if ((Vblack (sq) || flag.shade) && flag.rv)
  716. #endif /* !MSDOS || SEVENBIT */
  717.     OReverse ();
  718.       printz ("%d", 1 + z);
  719.       ONormal ();
  720.     }
  721.  
  722.   for (z = 0; z <= 7; z++)
  723.     {
  724.       short sq;
  725.  
  726.       sq = z;
  727.       gotoXY (VcoordI (sq, SQW, SQH));
  728. #if !defined(MSDOS) || defined(SEVENBIT)
  729.       if ((Vblack (sq) || flag.shade) && flag.rv)
  730. #endif /* !MSDOS || SEVENBIT */
  731.     OReverse ();
  732.       printz ("%c", cxx[z]);
  733.       ONormal ();
  734.     }
  735.  
  736. #if !defined(MSDOS) || defined(SEVENBIT)
  737.   for (z = 1; z <= (8 * SQH); z++)
  738.     {
  739.       gotoXY ((8 * SQW) + 1, z);
  740.       printz ("|");
  741.     }
  742. #endif /* MSDOS && !SEVENBIT */
  743. }
  744.  
  745. void
  746. ShowPostnValue (short int sq)
  747.  
  748. /*
  749.  * must have called ExaminePosition() first
  750.  */
  751.  
  752. {
  753.   short score;
  754.  
  755.   gotoXY (VcoordR (sq, 2, 1));
  756.   score = ScorePosition (color[sq]);
  757. #if !defined(MSDOS) || defined(SEVENBIT)
  758.   if (Vblack (sq) && !flag.shade)
  759.     OReverse ();
  760. #endif /* !MSDOS || SEVENBIT */
  761.  
  762.   if (color[sq] != neutral)
  763.     printz ("%3d", svalue[sq]);
  764.   else
  765. #if defined(MSDOS) && !defined(SEVENBIT)
  766.     {
  767.       if (flag.rv)
  768.     printz (Vblack (sq) ? "\262\262\262" : "\260\260\260");
  769.       else
  770.     printz (Vblack (sq) ? "\260\260\260" : "\262\262\262");
  771.     }
  772. #else
  773.     printz (flag.shade && Vblack (sq) ? "///" : "   ");
  774. #endif /* MSDOS && !SEVENBIT */
  775.   ONormal ();
  776. }
  777.  
  778. void
  779. ShowPostnValues (void)
  780. {
  781.   short sq, score;
  782.  
  783.   ExaminePosition ();
  784.   for (sq = 0; sq < 64; sq++)
  785.     ShowPostnValue (sq);
  786.   score = ScorePosition (opponent);
  787.   gotoXY (TAB, 5);
  788.  printz (CP[103], score, mtl[computer], pscore[computer], mtl[opponent],pscore[opponent]);
  789.   ClrEoln ();
  790. }
  791.  
  792. void
  793. UpdateDisplay (short int f, short int t, short int redraw, short int isspec)
  794. {
  795.   short sq;
  796.  
  797.   if (redraw)
  798.     {
  799.       ShowHeader ();
  800.       ShowPlayers ();
  801.       for (sq = 0; sq < 64; sq++)
  802.     {
  803.       DrawSquare (sq);
  804.       DrawPiece (sq);
  805.     }
  806.       if (flag.coords)
  807.     DrawCoords ();
  808.     }
  809.   else
  810.     {
  811.       DrawPiece (f);
  812.       DrawPiece (t);
  813.       if (isspec & cstlmask)
  814.     if (t > f)
  815.       {
  816.         DrawPiece (f + 3);
  817.         DrawPiece (t - 1);
  818.       }
  819.     else
  820.       {
  821.         DrawPiece (f - 4);
  822.         DrawPiece (t + 1);
  823.       }
  824.       else if (isspec & epmask)
  825.     {
  826.       DrawPiece (t - 8);
  827.       DrawPiece (t + 8);
  828.     }
  829.     }
  830.   if (PositionFlag)
  831.     ShowPostnValues ();
  832.   refresh ();
  833. }
  834.  
  835. extern char *InPtr;
  836. void
  837. skip ()
  838. {
  839.   while (*InPtr != ' ')
  840.     InPtr++;
  841.   while (*InPtr == ' ')
  842.     InPtr++;
  843. }
  844. void
  845. skipb ()
  846. {
  847.   while (*InPtr == ' ')
  848.     InPtr++;
  849. }
  850.  
  851. void
  852. ChangeAlphaWindow (void)
  853. {
  854.   ShowMessage (CP[114]);
  855.   scanz ("%hd", &WAwindow);
  856.   ShowMessage (CP[34]);
  857.   scanz ("%hd", &BAwindow);
  858. }
  859.  
  860. void
  861. ChangeBetaWindow (void)
  862. {
  863.   ShowMessage (CP[115]);
  864.   scanz ("%hd", &WBwindow);
  865.   ShowMessage (CP[35]);
  866.   scanz ("%hd", &BBwindow);
  867. }
  868.  
  869. void
  870. GiveHint (void)
  871. {
  872.   char s[40];
  873.   if (hint)
  874.     {
  875.       algbr ((short) (hint >> 8), (short) (hint & 0xFF), false);
  876.       strcpy (s, CP[198]);    /*try*/
  877.       strcat (s, mvstr[0]);
  878.       ShowMessage (s);
  879.     }
  880.   else
  881.     ShowMessage (CP[223]);
  882. }
  883.  
  884. void
  885. ChangeHashDepth (void)
  886. {
  887.   ShowMessage (CP[163]);
  888.   scanz ("%hd", &HashDepth);
  889.   ShowMessage (CP[82]);
  890.   scanz ("%hd", &HashMoveLimit);
  891. }
  892.  
  893. void
  894. ChangeSearchDepth (void)
  895. {
  896.   ShowMessage (CP[150]);
  897.   scanz ("%hd", &MaxSearchDepth);
  898.   TCflag = !(MaxSearchDepth > 0);
  899. }
  900.  
  901. void
  902. SetContempt (void)
  903. {
  904.   ShowMessage (CP[142]);
  905.   scanz ("%hd", &contempt);
  906. }
  907.  
  908.  
  909. void
  910. SetAnalysis (void)
  911. {
  912.   ShowMessage (CP[159]);
  913.   scanz ("%s", Analysis);
  914. }
  915.  
  916. void
  917. ChangeXwindow (void)
  918. {
  919.   ShowMessage (CP[208]);
  920.   scanz ("%hd", &xwndw);
  921. }
  922.  
  923. void
  924. SelectLevel (void)
  925. {
  926.   int item;
  927.  
  928.   ClrScreen ();
  929.   gotoXY (32, 2);
  930.   printz (CP[41]);
  931.   gotoXY (20, 4);
  932.   printz (CP[18]);
  933.   gotoXY (20, 5);
  934.   printz (CP[19]);
  935.   gotoXY (20, 6);
  936.   printz (CP[20]);
  937.   gotoXY (20, 7);
  938.   printz (CP[21]);
  939.   gotoXY (20, 8);
  940.   printz (CP[22]);
  941.   gotoXY (20, 9);
  942.   printz (CP[23]);
  943.   gotoXY (20, 10);
  944.   printz (CP[24]);
  945.   gotoXY (20, 11);
  946.   printz (CP[25]);
  947.   gotoXY (20, 12);
  948.   printz (CP[26]);
  949.   gotoXY (20, 13);
  950.   printz (CP[27]);
  951.  
  952.   OperatorTime = 0;
  953.   TCmoves = 60;
  954.   TCminutes = 5;
  955.   TCseconds = 0;
  956.   gotoXY (20, 17);
  957.   printz (CP[62]);
  958.   refresh ();
  959.   scanz ("%d", &item);
  960.   switch (item)
  961.     {
  962.     case 1:
  963.       TCmoves = 60;
  964.       TCminutes = 5;
  965.       break;
  966.     case 2:
  967.       TCmoves = 60;
  968.       TCminutes = 15;
  969.       break;
  970.     case 3:
  971.       TCmoves = 60;
  972.       TCminutes = 30;
  973.       break;
  974.     case 4:
  975.       TCmoves = 40;
  976.       TCminutes = 30;
  977.       break;
  978.     case 5:
  979.       TCmoves = 40;
  980.       TCminutes = 60;
  981.       break;
  982.     case 6:
  983.       TCmoves = 40;
  984.       TCminutes = 120;
  985.       break;
  986.     case 7:
  987.       TCmoves = 40;
  988.       TCminutes = 240;
  989.       break;
  990.     case 8:
  991.       TCmoves = 1;
  992.       TCminutes = 15;
  993.       break;
  994.     case 9:
  995.       TCmoves = 1;
  996.       TCminutes = 60;
  997.       break;
  998.     case 10:
  999.       TCmoves = 1;
  1000.       TCminutes = 600;
  1001.       break;
  1002.     }
  1003.  
  1004.   TCflag = (TCmoves > 0);
  1005.   SetTimeControl ();
  1006.   ClrScreen ();
  1007.   UpdateDisplay (0, 0, 1, 0);
  1008. }
  1009.  
  1010. void
  1011. DoDebug (void)
  1012. {
  1013.   short c, p, sq, tp, tc, tsq, score;
  1014.   char s[40];
  1015.  
  1016.   ExaminePosition ();
  1017.   ShowMessage (CP[65]);
  1018.   scanz ("%s", s);
  1019.   c = neutral;
  1020.   if (s[0] == CP[9][0] || s[0] == CP[9][1])    /* w W*/ c = white;
  1021.   if (s[0] == CP[9][2] || s[0] == CP[9][3])    /*b B*/ c = black;
  1022.   for (p = king; p > no_piece; p--)
  1023.     if ((s[1] == pxx[p]) || (s[1] == qxx[p])) break;
  1024.   if(p > no_piece)
  1025.   for (sq = 0; sq < 64; sq++)
  1026.     {
  1027.       tp = board[sq];
  1028.       tc = color[sq];
  1029.       board[sq] = p;
  1030.       color[sq] = c;
  1031.       tsq = PieceList[c][1];
  1032.       PieceList[c][1] = sq;
  1033.       ShowPostnValue (sq);
  1034.       PieceList[c][1] = tsq;
  1035.       board[sq] = tp;
  1036.       color[sq] = tc;
  1037.     }
  1038.   score = ScorePosition (opponent);
  1039.   gotoXY (TAB, 5);
  1040.   printz (CP[103], score, mtl[computer], pscore[computer], mtl[opponent],pscore[opponent]);
  1041.   ClrEoln ();
  1042. }
  1043. void
  1044. DoTable (short table[64])
  1045. {
  1046.   short  sq;
  1047.   ExaminePosition ();
  1048.   for (sq=0;sq<64;sq++){
  1049.  
  1050.   gotoXY (VcoordR (sq, 2, 1));
  1051. #if !defined(MSDOS) || defined(SEVENBIT)
  1052.   if (Vblack (sq) && !flag.shade)
  1053.     OReverse ();
  1054. #endif /* !MSDOS || SEVENBIT */
  1055.  
  1056.     printz ("%3d", table[sq]);
  1057.   ONormal ();
  1058. }
  1059. }
  1060.  
  1061.